EC2 Instance ConnectのAPIを直接叩いてSSHする
EC2 Instance Connectを利用すると、EC2インスタンスへのSSHアクセスをIAMで制御できます。
Connect Using EC2 Instance Connect - Amazon Elastic Compute Cloud
EC2 Instance ConnectのSSH 方法は以下の3通りがあります。
- マネジメントコンソールからブラウザ越しにSSH
- EC2 Instance Connect CLIを利用してSSH
- ユーザーが直接APIを叩いてコマンドラインからSSH
3つ目を使いやすくしたのが2つ目であるため、通常は
- ブラウザから利用したい場合1つ目
- コマンドランから利用したい場合2つ目
を採用することが多いかと思います。
今回は、 EC2 Instance Connect CLI が何をやっているのか理解するために、あえて手間のかかる3つ目で SSH する方法を紹介します。
ゴール
EC2 Instance Connect CLI の mssh
を使うと
$ mssh i-1234
でSSHできます。
eic-cli.sh
というBashスクリプトを自作し、同じように
$ eic-cli.sh i-1234
でSSHできるようにします。
処理の流れ
EC2 Instance Connect を使った SSH は以下の流れで行われます。
図の引用元 https://dev.classmethod.jp/cloud/aws/ec2-instance-connect/
この内、 EC2 Instance Connect CLI の責務は以下のステップです。
- #1:公開鍵/秘密鍵のペアを生成する
- #2:SendSSHPublicKey APIで公開鍵を登録する
- #5:秘密鍵でEC2にログインする
これらステップの中で、 EC2 インスタンスのアベイラビリティーゾーンやパブリックIPアドレスといった情報も必要になるため、シェルスクリプト内ではそれらの情報も取得します。
実際のコード
実際のBashスクリプトは以下の通りです。
重要な箇所のみ解説します。
EC2 のメタ情報を取得
EC2のインスタンスIDを元に、インスタンスのメタ情報
- アベイラビリティーゾーン (ステップ #2 で利用)
- IPアドレス(ステップ #5 で利用)
を EC2::DescribeInstances API から取得します。
AWS EC2 Instance Connect CLI では ec2_util.py で実装されています。
キーペアの生成
SSh 接続時に利用する公開鍵のペアを作成します。 シェルスクリプトでは OpenSSH の ssh-keygen コマンドを直接叩いています。
AWS EC2 Instance Connect CLI ではkey_utils.py で実装されています。
SSH 公開鍵を登録。
生成された公開鍵を EC2 Instance Connect::SendSSHPublicKey API でAWS に登録します。
登録時には、以下の情報が必要です。
- InstanceId : インスタンス ID
- AvailabilityZone : アベイラビリティゾーン
- InstanceOSUser : ログインするユーザー名(今回は ec2-user にハードコード)
- SSHPublicKey : 公開鍵
登録した鍵は60秒だけ有効です。
AWS EC2 Instance Connect CLI では key_publisher.py で実装されています。
実行してみる
このスクリプトを実際に実行してみます。
$ bash eic-cli.sh i-0184d8ed11294e779 /tmp/ssh.yZFLoE already exists. Overwrite (y/n)? y private key path : /tmp/ssh.yZFLoE { "RequestId": "90588414-feb8-4cc4-beb4-70fc01c6ed73", "Success": true } Last login: Wed Jul 3 14:16:48 2019 from *** __| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___| https://aws.amazon.com/amazon-linux-2/ $ $ curl http://169.254.169.254/latest/meta-data/instance-id i-0184d8ed11294e779 $
無事 SSH でログインできました。
最後の箇所では、シェルスクリプトで指定したインスタンスIDとログイン先インスタンスのインスタンスIDが一致していることを、念のために確認しています。
最後に
AWS EC2 Instance Connect のヘルパー CLI「mssh」を使わずに、各処理を直接実行して SSH する方法を紹介しました。
AWS EC2 Instance Connect でブラウザ越しや公式CLI経由のSSHがうまく動作しないときは、APIを直接呼び出して、問題切り分けすることも検討ください。
それでは。